﻿/*
 * Copyright (C) 2020-2023 Alibaba Group Holding Limited
 */

#ifndef SOC_INIT_H
#define SOC_INIT_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include "aos/hal/gpio.h"

typedef enum {
    PORT_UART_STD = 0,
    PORT_UART_485_1,
    PORT_UART_485_2,
    PORT_UART_4G,
    PORT_UART_ZIGBEE,
    PORT_UART_P5,
    PORT_UART_SIZE,
    PORT_UART_INVALID = 255
}port_uart_type_e;

typedef enum{
    PORT_CAN_IO = 0,
    PORT_CAN_RESERVED,
    PORT_CAN_SIZE,
    PORT_CAN_INVALID = 255,
} PORT_CAN_TYPE;

typedef enum {
    PORT_GPIO_P8_6 = 0,
    PORT_GPIO_P9_6,
    PORT_GPIO_TP_INT,
    PORT_GPIO_ETH_RST,
    PORT_GPIO_TCA_RST,
    PORT_GPIO_TCA_INT,
    PORT_GPIO_SD1_CD,
    PORT_ONCHIP_GPIO_NUM = 100 ,
    PORT_GPIO_DO_1,
    PORT_GPIO_DO_2,
    PORT_GPIO_DO_3,
    PORT_GPIO_DO_4,
    PORT_GPIO_4G_EN,
    PORT_GPIO_ZIGBEE_EN,
    PORT_GPIO_DI_1,
    PORT_GPIO_DI_2,
    PORT_GPIO_DI_3,
    PORT_GPIO_DI_4,
    PORT_GPIO_S2_1,
    PORT_GPIO_S2_2,
    PORT_GPIO_S2_3,
    PORT_GPIO_S2_4,
    PORT_GPIO_SIZE
} PORT_GPIO_T;

typedef struct {
    void      *base;
    uint8_t    pin;
} drv_manufacturer_t;

typedef struct{
    uint8_t            port;   /* Logical Port */
    drv_manufacturer_t drv;
    gpio_dev_t        *hal_dev;
} gpio_mapping_t;

typedef int32_t (*gpio_device_init)(drv_manufacturer_t *gpio_drv, gpio_config_t config);
typedef int32_t (*gpio_device_output_high)(drv_manufacturer_t *gpio_drv);
typedef int32_t (*gpio_device_output_low)(drv_manufacturer_t *gpio_drv);
typedef int32_t (*gpio_device_output_toggle)(drv_manufacturer_t *gpio_drv);
typedef int32_t (*gpio_device_input_get)(drv_manufacturer_t *gpio_drv, uint32_t *value);
typedef int32_t (*gpio_device_enable_irq)(drv_manufacturer_t *gpio_drv, gpio_irq_trigger_t trigger,
                            gpio_irq_handler_t handler, void *arg);
typedef int32_t (*gpio_device_disable_irq)(drv_manufacturer_t *gpio_drv);
typedef int32_t (*gpio_device_clear_irq)(drv_manufacturer_t *gpio_drv);
typedef int32_t (*gpio_device_finalize)(drv_manufacturer_t *gpio_drv);

typedef struct {
    gpio_device_init init;
    gpio_device_output_high output_high;
    gpio_device_output_low output_low;
    gpio_device_output_toggle output_toggle;
    gpio_device_input_get input_get;
    gpio_device_enable_irq enable_irq;
    gpio_device_disable_irq disable_irq;
    gpio_device_clear_irq clear_irq;
    gpio_device_finalize finalize;
}st_gpio_opt_t;

gpio_mapping_t* get_drv_manu_info(gpio_dev_t *gpio);

#ifdef __cplusplus
}
#endif

#endif

